package com.itany.corejava.code08_常用类.string;

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author 石小俊
 * @date 2023年04月26日 9:24
 */
public class Test06_练习 {

    private static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        test04();
    }

    /**
     * 控制台输入一个字符串,统计字符串包含多少个数字、英文字母以及其他字符
     */
    public static void test01() {
        System.out.print("请输入任意一个字符串:");
        String s = sc.next();
        // 由于字符串中可能存在大小写,但是统计时不关心
        // 因此,可以统一将英文字母改为大写或者小写
        s = s.toUpperCase();
        // 准备三个变量,用于接收统计的数量
        int count1 = 0, count2 = 0, count3 = 0;
        // 遍历字符串中所有的字符
        for (int i = 0; i < s.length(); i++) {
            // 取出当前迭代的字符
            char c = s.charAt(i);
            // 判断当前取出的字符类型
            if (c >= '0' && c <= '9') {
                // 则数字的数量+1
                count1++;
            } else if (c >= 'A' && c <= 'Z') {
                // 则英文字母数量+1
                count2++;
            } else {
                count3++;
            }
        }
        System.out.println("数字出现了:" + count1 + "次,英文字母出现了" + count2 + "次,其他字符出现了" + count3 + "次");
    }

    /**
     * 控制台输入一个字符串,统计每个字母出现的次数(忽略大小写)并输出
     */
    public static void test02() {
        System.out.print("请输入任意一个字符串:");
        String s = sc.next();
        // 由于忽略大小写,则可以将其统一转换成大写或者小写
        s = s.toLowerCase();
        // 将字符串转换成char数组
        char[] arr = s.toCharArray();
        // 统计每个字母出现的次数,则通过双重for循环进行操作
        // 外层循环遍历所有需要统计的字母
        for (char i = 'a'; i <= 'z'; i++) {
            // 每遍历一个字母,设置一个变量用于统计该字母出现的次数
            int count = 0;
            // 内层循环遍历字符数组中所有的字符
            for (char c : arr) {
                // 如果当前遍历的字母与数组中的字符一致
                if (i == c) {
                    // 则数量+1
                    count++;
                }
            }
            // 只打印出现过的字母
            if (count > 0) {
                // 打印每个字母出现的次数
                System.out.println("字母" + i + "出现了" + count + "次");
            }
        }
    }

    /**
     * 控制台输入一个字符串,对字符串中字符进行自然顺序的排序,将排序后的字符串展示出来
     */
    public static void test03() {
        System.out.print("请输入任意一个字符串:");
        String s = sc.next();
        // 将字符串转换成字符数组
        char[] cs = s.toCharArray();
        // 调用Arrays工具类中提供的排序方法进行排序
        Arrays.sort(cs);
        // 将字符数组转换成字符串
        String result = new String(cs);
        System.out.println(result);
    }


    /**
     * 控制台输入两个字符串,计算第二个字符串在第一个字符串中出现的次数
     */
    public static void test04() {
        System.out.print("请输入第一个字符串:");
        String s = sc.next();
        System.out.print("请输入第二个字符串:");
        String s2 = sc.next();
        if (s.length() >= s2.length()) {
            // 准备一个变量,用于接收出现的次数
            int count = 0;
            // 准备一个变量,用于接收出现位置的索引号,便于截取字符串
            int index = 0;
            // 查询s2在s2中第一次出现的位置
            while ((index = s.indexOf(s2)) != -1) {
                // 只要找到了,则出现次数+1
                count++;
                // 此时找到的部分已经不需要再次查找了
                // 为了便于查找下一个,将已找到的部分截取掉
                // 从找到位置的索引值+子字符串长度的位置开始截取,一直截取到末尾
                s = s.substring(index + s2.length());
            }
            System.out.println("第二个字符串在第一个字符串中出现了" + count + "次");
        } else {
            System.out.println("第二个字符串没有在第一个字符串中出现");
        }
    }
}
